home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / DOS / PRGMMING / M2PROTOS.ZIP / CRC.A < prev    next >
Encoding:
Text File  |  1991-02-09  |  17.1 KB  |  584 lines

  1. (* module CRC *)
  2.  
  3. (*
  4. Cyclic redundancy check and checksum routines for JPI Modula-2
  5.     by Carl Neiburger
  6.        169 N. 25th St.
  7.        San Jose, Calif. 95116
  8.  
  9.        CompuServe No. 72336,2257
  10.  
  11. *)
  12.  
  13. sameCS   = 1 - ( (model / 1) & 1 )
  14. sameDS   = 1 - ( (model / 2) & 1 )
  15. LongAddr = ( (model / 4) & 1 ) | ( (model / 2) & 1 )
  16. RegParam = (model / 16) & 1
  17. LongOrStakParam = LongAddr | (RegParam-1)
  18. (*%F sameCS *)
  19.     frame = 6
  20. (*%E *)
  21. (*%T sameCS *)
  22.     frame = 4
  23. (*%E *)
  24.  
  25. module CRC
  26.  
  27. section
  28. segment _TEXT(CODE,28H); segment _DATA(DATA, 28H)
  29.  
  30. select _DATA 
  31. CRC16table:
  32. dw     00000H, 01021H, 02042H, 03063H, 04084H, 050A5H, 060C6H, 070E7H
  33. dw     08108H, 09129H, 0A14AH, 0B16BH, 0C18CH, 0D1ADH, 0E1CEH, 0F1EFH
  34. dw     01231H, 00210H, 03273H, 02252H, 052B5H, 04294H, 072F7H, 062D6H
  35. dw     09339H, 08318H, 0B37BH, 0A35AH, 0D3BDH, 0C39CH, 0F3FFH, 0E3DEH
  36. dw     02462H, 03443H, 00420H, 01401H, 064E6H, 074C7H, 044A4H, 05485H
  37. dw     0A56AH, 0B54BH, 08528H, 09509H, 0E5EEH, 0F5CFH, 0C5ACH, 0D58DH
  38. dw     03653H, 02672H, 01611H, 00630H, 076D7H, 066F6H, 05695H, 046B4H
  39. dw     0B75BH, 0A77AH, 09719H, 08738H, 0F7DFH, 0E7FEH, 0D79DH, 0C7BCH
  40. dw     048C4H, 058E5H, 06886H, 078A7H, 00840H, 01861H, 02802H, 03823H
  41. dw     0C9CCH, 0D9EDH, 0E98EH, 0F9AFH, 08948H, 09969H, 0A90AH, 0B92BH
  42. dw     05AF5H, 04AD4H, 07AB7H, 06A96H, 01A71H, 00A50H, 03A33H, 02A12H
  43. dw     0DBFDH, 0CBDCH, 0FBBFH, 0EB9EH, 09B79H, 08B58H, 0BB3BH, 0AB1AH
  44. dw     06CA6H, 07C87H, 04CE4H, 05CC5H, 02C22H, 03C03H, 00C60H, 01C41H
  45. dw     0EDAEH, 0FD8FH, 0CDECH, 0DDCDH, 0AD2AH, 0BD0BH, 08D68H, 09D49H
  46. dw     07E97H, 06EB6H, 05ED5H, 04EF4H, 03E13H, 02E32H, 01E51H, 00E70H
  47. dw     0FF9FH, 0EFBEH, 0DFDDH, 0CFFCH, 0BF1BH, 0AF3AH, 09F59H, 08F78H
  48. dw     09188H, 081A9H, 0B1CAH, 0A1EBH, 0D10CH, 0C12DH, 0F14EH, 0E16FH
  49. dw     01080H, 000A1H, 030C2H, 020E3H, 05004H, 04025H, 07046H, 06067H
  50. dw     083B9H, 09398H, 0A3FBH, 0B3DAH, 0C33DH, 0D31CH, 0E37FH, 0F35EH
  51. dw     002B1H, 01290H, 022F3H, 032D2H, 04235H, 05214H, 06277H, 07256H
  52. dw     0B5EAH, 0A5CBH, 095A8H, 08589H, 0F56EH, 0E54FH, 0D52CH, 0C50DH
  53. dw     034E2H, 024C3H, 014A0H, 00481H, 07466H, 06447H, 05424H, 04405H
  54. dw     0A7DBH, 0B7FAH, 08799H, 097B8H, 0E75FH, 0F77EH, 0C71DH, 0D73CH
  55. dw     026D3H, 036F2H, 00691H, 016B0H, 06657H, 07676H, 04615H, 05634H
  56. dw     0D94CH, 0C96DH, 0F90EH, 0E92FH, 099C8H, 089E9H, 0B98AH, 0A9ABH
  57. dw     05844H, 04865H, 07806H, 06827H, 018C0H, 008E1H, 03882H, 028A3H
  58. dw     0CB7DH, 0DB5CH, 0EB3FH, 0FB1EH, 08BF9H, 09BD8H, 0ABBBH, 0BB9AH
  59. dw     04A75H, 05A54H, 06A37H, 07A16H, 00AF1H, 01AD0H, 02AB3H, 03A92H
  60. dw     0FD2EH, 0ED0FH, 0DD6CH, 0CD4DH, 0BDAAH, 0AD8BH, 09DE8H, 08DC9H
  61. dw     07C26H, 06C07H, 05C64H, 04C45H, 03CA2H, 02C83H, 01CE0H, 00CC1H
  62. dw     0EF1FH, 0FF3EH, 0CF5DH, 0DF7CH, 0AF9BH, 0BFBAH, 08FD9H, 09FF8H
  63. dw     06E17H, 07E36H, 04E55H, 05E74H, 02E93H, 03EB2H, 00ED1H, 01EF0H
  64.  
  65. select _TEXT
  66.  
  67. (*%F RegParam *)
  68. (*%T LongAddr *)
  69. Sseg = 6+frame; Sofs = 4 + frame; Slen = 2+frame; CRC = frame; RetSize = 8
  70. (*%E *)
  71. (*%F LongAddr *)
  72. Sofs = 4+frame; Slen = 2+ frame; CRC = frame; RetSize = 6
  73. (*%E *)
  74. (*%E *)
  75. (*%T RegParam *)
  76. RetSize = 0
  77. (*%E *)
  78. public CRC$DoCRC:
  79. (*%F RegParam *)
  80.   push bp
  81.   mov  bp,sp
  82. (*%E *)
  83. (*%T LongAddr *)
  84.   push ds
  85. (*%E *)
  86.   push si
  87.   push di
  88. (*%F RegParam *)
  89.     (*%T LongAddr *)
  90.   lds  si, [bp][Sofs]
  91.     (*%E *)
  92.     (*%F LongAddr *)
  93.   mov  si, ds
  94.   mov  es, si
  95.   mov  si, [bp][Sofs]
  96.     (*%E *)
  97.   mov cx,[bp][Slen]
  98.   mov ax,[bp][CRC]
  99. (*%E *)
  100. (*%T RegParam *)
  101.     (*%T LongAddr *)
  102.   mov  si, ax           (* offset *)
  103.   mov  ds, bx           (* segment *)
  104.   mov  ax, dx           (* CRC; CX = L *)
  105.     (*%E *)
  106.     (*%F LongAddr *)
  107.   mov  si, ax           (* offset *)
  108.   mov  ax, cx           (* CRC *)
  109.   mov  cx, bx           (* L   *)
  110.     (*%E *)
  111. (*%E *)
  112. (*%T LongAddr *)
  113.   mov  di, seg CRC16table
  114.   mov  es, di
  115.   mov  di, CRC16table
  116. (*%E *)
  117. (*%F LongAddr *)
  118.   mov  di, CRC16table  (* we won't bother with es *)
  119. (*%E *)
  120.   jcxz   CRC16Return
  121. CRCloop:
  122.   mov    bl,ah
  123.   mov    ah,al
  124.   xor    bh,bh
  125.   lodsb
  126.   xor    bl,al
  127.   shl    bx,1
  128.   xor    al, al
  129.   xor    ax,es:[di][bx]
  130.   loop   CRCloop
  131. CRC16Return:
  132.   pop  di
  133.   pop  si
  134. (*%T LongAddr *)
  135.   pop  ds
  136. (*%E *)
  137. (*%F RegParam *)
  138.   pop bp
  139. (*%E *)
  140. (*%F sameCS *)
  141.   ret far RetSize
  142. (*%E *)
  143. (*%T sameCS *)
  144.   ret RetSize
  145. (*%E *)
  146.  
  147. section; segment _TEXT(CODE,28H); segment _DATA(DATA, 28H)
  148.  
  149. select _DATA 
  150. KCRC@KCrcTable:
  151. dw  0000H,  1189H,  2312H,  329BH,  4624H,  57ADH,  6536H,  74BFH 
  152. dw  8C48H,  9DC1H, 0AF5AH, 0BED3H, 0CA6CH, 0DBE5H, 0E97EH, 0F8F7H 
  153. dw  1081H,   108H,  3393H,  221AH,  56A5H,  472CH,  75B7H,  643EH 
  154. dw  9CC9H,  8D40H, 0BFDBH, 0AE52H, 0DAEDH, 0CB64H, 0F9FFH, 0E876H 
  155. dw  2102H,  308BH,  0210H,  1399H,  6726H,  76AFH,  4434H,  55BDH 
  156. dw 0AD4AH, 0BCC3H,  8E58H,  9FD1H, 0EB6EH, 0FAE7H, 0C87CH, 0D9F5H 
  157. dw  3183H,  200AH,  1291H,   318H,  77A7H,  662EH,  54B5H,  453CH 
  158. dw 0BDCBH, 0AC42H,  9ED9H,  8F50H, 0FBEFH, 0EA66H, 0D8FDH, 0C974H 
  159. dw  4204H,  538DH,  6116H,  709FH,   420H,  15A9H,  2732H,  36BBH 
  160. dw 0CE4CH, 0DFC5H, 0ED5EH, 0FCD7H,  8868H,  99E1H, 0AB7AH, 0BAF3H 
  161. dw  5285H,  430CH,  7197H,  601EH,  14A1H,   528H,  37B3H,  263AH 
  162. dw 0DECDH, 0CF44H, 0FDDFH, 0EC56H,  98E9H,  8960H, 0BBFBH, 0AA72H 
  163. dw  6306H,  728FH,  4014H,  519DH,  2522H,  34ABH,   630H,  17B9H 
  164. dw 0EF4EH, 0FEC7H, 0CC5CH, 0DDD5H, 0A96AH, 0B8E3H,  8A78H,  9BF1H 
  165. dw  7387H,  620EH,  5095H,  411CH,  35A3H,  242AH,  16B1H,   738H 
  166. dw 0FFCFH, 0EE46H, 0DCDDH, 0CD54H, 0B9EBH, 0A862H,  9AF9H,  8B70H 
  167. dw  8408H,  9581H, 0A71AH, 0B693H, 0C22CH, 0D3A5H, 0E13EH, 0F0B7H 
  168. dw   840H,  19C9H,  2B52H,  3ADBH,  4E64H,  5FEDH,  6D76H,  7CFFH 
  169. dw  9489H,  8500H, 0B79BH, 0A612H, 0D2ADH, 0C324H, 0F1BFH, 0E036H 
  170. dw  18C1H,   948H,  3BD3H,  2A5AH,  5EE5H,  4F6CH,  7DF7H,  6C7EH 
  171. dw 0A50AH, 0B483H,  8618H,  9791H, 0E32EH, 0F2A7H, 0C03CH, 0D1B5H 
  172. dw  2942H,  38CBH,  0A50H,  1BD9H,  6F66H,  7EEFH,  4C74H,  5DFDH 
  173. dw 0B58BH, 0A402H,  9699H,  8710H, 0F3AFH, 0E226H, 0D0BDH, 0C134H 
  174. dw  39C3H,  284AH,  1AD1H,  0B58H,  7FE7H,  6E6EH,  5CF5H,  4D7CH 
  175. dw 0C60CH, 0D785H, 0E51EH, 0F497H,  8028H,  91A1H, 0A33AH, 0B2B3H 
  176. dw  4A44H,  5BCDH,  6956H,  78DFH,  0C60H,  1DE9H,  2F72H,  3EFBH 
  177. dw 0D68DH, 0C704H, 0F59FH, 0E416H,  90A9H,  8120H, 0B3BBH, 0A232H 
  178. dw  5AC5H,  4B4CH,  79D7H,  685EH,  1CE1H,  0D68H,  3FF3H,  2E7AH 
  179. dw 0E70EH, 0F687H, 0C41CH, 0D595H, 0A12AH, 0B0A3H,  8238H,  93B1H 
  180. dw  6B46H,  7ACFH,  4854H,  59DDH,  2D62H,  3CEBH,  0E70H,  1FF9H 
  181. dw 0F78FH, 0E606H, 0D49DH, 0C514H, 0B1ABH, 0A022H,  92B9H,  8330H 
  182. dw  7BC7H,  6A4EH,  58D5H,  495CH,  3DE3H,  2C6AH,  1EF1H,  0F78H
  183.  
  184. select _TEXT
  185.  
  186. (*%F RegParam *)
  187. (*%T LongAddr *)
  188. Sseg = 6+frame; Sofs = 4 + frame; Slen = 2+frame; CRC = frame; RetSize = 8
  189. (*%E *)
  190. (*%F LongAddr *)
  191. Sofs = 4+frame; Slen = 2+ frame; CRC = frame; RetSize = 6
  192. (*%E *)
  193. (*%E *)
  194. (*%T RegParam *)
  195. RetSize = 0
  196. (*%E *)
  197. public CRC$DoKCRC: 
  198. (*%F RegParam *)
  199.   push bp
  200.   mov  bp,sp
  201. (*%E *)
  202. (*%T LongAddr *)
  203.   push ds
  204. (*%E *)
  205.   push si
  206.   push di
  207. (*%F RegParam *)
  208.     (*%T LongAddr *)
  209.   lds  si, [bp][Sofs]
  210.     (*%E *)
  211.     (*%F LongAddr *)
  212.   mov  si, ds
  213.   mov  es, si
  214.   mov  si, [bp][Sofs]
  215.     (*%E *)
  216.   mov cx,[bp][Slen]
  217.   mov bx,[bp][CRC]
  218. (*%E *)
  219. (*%T RegParam *)
  220.     (*%T LongAddr *)
  221.   mov  si, ax
  222.   mov  ds, bx
  223.   mov  bx, dx           (* CX = L; BX = CRC *)
  224.     (*%E *)
  225.     (*%F LongAddr *)
  226.   mov  si, ds
  227.   mov  es, si
  228.   mov  si, ax
  229.   xchg bx, cx           (* BX = CRC; CX = L *)
  230.     (*%E *)
  231. (*%E *)
  232.   jcxz   Return
  233. (*%T LongAddr *)
  234.   mov  di, seg KCRC@KCrcTable
  235.   mov  es, di
  236.   mov  di, KCRC@KCrcTable
  237. (*%E *)
  238. (*%F LongAddr *)
  239.   mov  di, KCRC@KCrcTable    (* we won't bother with es *)
  240. (*%E *)
  241.   cld                   (* just to be safe *)
  242. LoopTop:
  243.   lodsb
  244.   xor  ah, ah           (* keep empty                         *)
  245.   xor  al, bl           (* C xor ( Crc MOD 100H )             *)
  246.   xchg ax, bx           (* get table pointer in BX            *)  
  247.   shl  bx, 1            (* make it a word pointer             *)
  248. (*%T LongAddr *)
  249.   mov  bx, es:[di][bx]  (* look up value                      *)
  250. (*%E *)
  251. (*%F LongAddr *)
  252.   mov  bx, [di][bx]     (* look up value                      *)
  253. (*%E *)
  254.   xor  bl, ah           (* CRC = (Crc >> 8) xor KCrcTable[C]) *)
  255.   loop LoopTop
  256. Return:
  257.   mov  ax, bx           (* return CRC *)
  258.   pop  di
  259.   pop  si
  260. (*%T LongAddr *)
  261.   pop  ds
  262. (*%E *)
  263. (*%F RegParam *)
  264.   pop bp
  265. (*%E *)
  266. (*%F sameCS *)
  267.   ret far RetSize
  268. (*%E *)
  269. (*%T sameCS *)
  270.   ret RetSize
  271. (*%E *)
  272.  
  273. section; segment _TEXT(CODE,28H); select _TEXT
  274.  
  275. (*%F RegParam *)
  276. (*%T LongAddr *)
  277. Sseg = 6+frame; Sofs = 4 + frame; Slen = 2+frame; CRC = frame; RetSize = 8
  278. (*%E *)
  279. (*%F LongAddr *)
  280. Sofs = 4+frame; Slen = 2+ frame; CRC = frame; RetSize = 6
  281. (*%E *)
  282. (*%E *)
  283. (*%T RegParam *)
  284. RetSize = 0
  285. (*%E *)
  286. public CRC$DoCks:
  287. (*%F RegParam *)
  288.   push bp
  289.   mov  bp,sp
  290. (*%E *)
  291. (*%T LongAddr *)
  292.   push ds
  293. (*%E *)
  294.   push si
  295. (*%F RegParam *)
  296.     (*%T LongAddr *)
  297.   lds  si, [bp][Sofs]
  298.     (*%E *)
  299.     (*%F LongAddr *)
  300.   mov  si, [bp][Sofs]
  301.     (*%E *)
  302.   mov cx,[bp][Slen]
  303.   mov bx,[bp][CRC]
  304. (*%E *)
  305. (*%T RegParam *)
  306.     (*%T LongAddr *)
  307.   mov  si, ax
  308.   mov  ds, bx
  309.   mov  bx, dx           (* CX = L; BX = CRC *)
  310.     (*%E *)
  311.     (*%F LongAddr *)
  312.   mov  si, ax
  313.   xchg bx, cx           (* BX = CRC; CX = L *)
  314.     (*%E *)
  315. (*%E *)
  316.   jcxz   Return
  317. Chk0:
  318.     lodsb               (* al = next buffer element *)
  319.     add     bl, al
  320.     loop    Chk0        (* continue *)
  321. Return:
  322.     mov     al, bl
  323.     xor     ah,ah
  324.     pop  si
  325. (*%T LongAddr *)
  326.     pop  ds
  327. (*%E *)
  328. (*%F RegParam *)
  329.   pop bp
  330. (*%E *)
  331. (*%F sameCS *)
  332.     ret  far RetSize
  333. (*%E *)
  334. (*%T sameCS *)
  335.     ret near RetSize
  336. (*%E *)
  337.  
  338. section; segment _TEXT(CODE,28H); 
  339.  
  340. (*%F RegParam *)
  341. (*%T LongAddr *)
  342. Sseg = 6+frame; Sofs = 4 + frame; Slen = 2+frame; CRC = frame; RetSize = 8
  343. (*%E *)
  344. (*%F LongAddr *)
  345. Sofs = 4+frame; Slen = 2+ frame; CRC = frame; RetSize = 6
  346. (*%E *)
  347. (*%E *)
  348. (*%T RegParam *)
  349. RetSize = 0
  350. (*%E *)
  351. public CRC$DoBCks:
  352. (*%F RegParam *)
  353.   push bp
  354.   mov  bp,sp
  355. (*%E *)
  356. (*%T LongAddr *)
  357.   push ds
  358. (*%E *)
  359.   push si
  360. (*%F RegParam *)
  361.     (*%T LongAddr *)
  362.   lds  si, [bp][Sofs]
  363.     (*%E *)
  364.     (*%F LongAddr *)
  365.   mov  si, [bp][Sofs]
  366.     (*%E *)
  367.   mov cx,[bp][Slen]
  368.   mov bx,[bp][CRC]
  369. (*%E *)
  370. (*%T RegParam *)
  371.     (*%T LongAddr *)
  372.   mov  si, ax
  373.   mov  ds, bx
  374.   mov  bx, dx           (* CX = L; BX = CRC *)
  375.     (*%E *)
  376.     (*%F LongAddr *)
  377.     mov  si, ax
  378.     xchg bx, cx           (* BX = CRC; CX = L *)
  379.     (*%E *)
  380. (*%E *)
  381.     jcxz   Return
  382.     xor    bh, bh       (* use for addition *)
  383. BChk0:
  384.     shl     bl,1
  385.     adc     bl,bh 
  386.     lodsb
  387.     add     bl,al
  388.     adc     bl,bh
  389.     loop    BChk0        (* continue *)
  390. Return:
  391.     mov     ax, bx
  392.     pop  si
  393. (*%T LongAddr *)
  394.     pop  ds
  395. (*%E *)
  396. (*%F RegParam *)
  397.   pop bp
  398. (*%E *)
  399. (*%F sameCS *)
  400.     ret  far RetSize
  401. (*%E *)
  402. (*%T sameCS *)
  403.     ret near RetSize
  404. (*%E *)
  405.  
  406. section
  407. segment _TEXT(CODE,28H); segment _DATA(DATA, 28H)
  408.  
  409. select _DATA 
  410. CRC32table:
  411. dw  00000H, 00000H, 03096H, 07707H, 0612CH, 0EE0EH, 051BAH, 09909H
  412. dw  0C419H, 0076DH, 0F48FH, 0706AH, 0A535H, 0E963H, 095A3H, 09E64H
  413. dw  08832H, 00EDBH, 0B8A4H, 079DCH, 0E91EH, 0E0D5H, 0D988H, 097D2H
  414. dw  04C2BH, 009B6H, 07CBDH, 07EB1H, 02D07H, 0E7B8H, 01D91H, 090BFH
  415. dw  01064H, 01DB7H, 020F2H, 06AB0H, 07148H, 0F3B9H, 041DEH, 084BEH
  416. dw  0D47DH, 01ADAH, 0E4EBH, 06DDDH, 0B551H, 0F4D4H, 085C7H, 083D3H
  417. dw  09856H, 0136CH, 0A8C0H, 0646BH, 0F97AH, 0FD62H, 0C9ECH, 08A65H
  418. dw  05C4FH, 01401H, 06CD9H, 06306H, 03D63H, 0FA0FH, 00DF5H, 08D08H
  419. dw  020C8H, 03B6EH, 0105EH, 04C69H, 041E4H, 0D560H, 07172H, 0A267H
  420. dw  0E4D1H, 03C03H, 0D447H, 04B04H, 085FDH, 0D20DH, 0B56BH, 0A50AH
  421. dw  0A8FAH, 035B5H, 0986CH, 042B2H, 0C9D6H, 0DBBBH, 0F940H, 0ACBCH
  422. dw  06CE3H, 032D8H, 05C75H, 045DFH, 00DCFH, 0DCD6H, 03D59H, 0ABD1H
  423. dw  030ACH, 026D9H, 0003AH, 051DEH, 05180H, 0C8D7H, 06116H, 0BFD0H
  424. dw  0F4B5H, 021B4H, 0C423H, 056B3H, 09599H, 0CFBAH, 0A50FH, 0B8BDH
  425. dw  0B89EH, 02802H, 08808H, 05F05H, 0D9B2H, 0C60CH, 0E924H, 0B10BH
  426. dw  07C87H, 02F6FH, 04C11H, 05868H, 01DABH, 0C161H, 02D3DH, 0B666H
  427. dw  04190H, 076DCH, 07106H, 001DBH, 020BCH, 098D2H, 0102AH, 0EFD5H
  428. dw  08589H, 071B1H, 0B51FH, 006B6H, 0E4A5H, 09FBFH, 0D433H, 0E8B8H
  429. dw  0C9A2H, 07807H, 0F934H, 00F00H, 0A88EH, 09609H, 09818H, 0E10EH
  430. dw  00DBBH, 07F6AH, 03D2DH, 0086DH, 06C97H, 09164H, 05C01H, 0E663H
  431. dw  051F4H, 06B6BH, 06162H, 01C6CH, 030D8H, 08565H, 0004EH, 0F262H
  432. dw  095EDH, 06C06H, 0A57BH, 01B01H, 0F4C1H, 08208H, 0C457H, 0F50FH
  433. dw  0D9C6H, 065B0H, 0E950H, 012B7H, 0B8EAH, 08BBEH, 0887CH, 0FCB9H
  434. dw  01DDFH, 062DDH, 02D49H, 015DAH, 07CF3H, 08CD3H, 04C65H, 0FBD4H
  435. dw  06158H, 04DB2H, 051CEH, 03AB5H, 00074H, 0A3BCH, 030E2H, 0D4BBH
  436. dw  0A541H, 04ADFH, 095D7H, 03DD8H, 0C46DH, 0A4D1H, 0F4FBH, 0D3D6H
  437. dw  0E96AH, 04369H, 0D9FCH, 0346EH, 08846H, 0AD67H, 0B8D0H, 0DA60H
  438. dw  02D73H, 04404H, 01DE5H, 03303H, 04C5FH, 0AA0AH, 07CC9H, 0DD0DH
  439. dw  0713CH, 05005H, 041AAH, 02702H, 01010H, 0BE0BH, 02086H, 0C90CH
  440. dw  0B525H, 05768H, 085B3H, 0206FH, 0D409H, 0B966H, 0E49FH, 0CE61H
  441. dw  0F90EH, 05EDEH, 0C998H, 029D9H, 09822H, 0B0D0H, 0A8B4H, 0C7D7H
  442. dw  03D17H, 059B3H, 00D81H, 02EB4H, 05C3BH, 0B7BDH, 06CADH, 0C0BAH
  443. dw  08320H, 0EDB8H, 0B3B6H, 09ABFH, 0E20CH, 003B6H, 0D29AH, 074B1H
  444. dw  04739H, 0EAD5H, 077AFH, 09DD2H, 02615H, 004DBH, 01683H, 073DCH
  445. dw  00B12H, 0E363H, 03B84H, 09464H, 06A3EH, 00D6DH, 05AA8H, 07A6AH
  446. dw  0CF0BH, 0E40EH, 0FF9DH, 09309H, 0AE27H, 00A00H, 09EB1H, 07D07H
  447. dw  09344H, 0F00FH, 0A3D2H, 08708H, 0F268H, 01E01H, 0C2FEH, 06906H
  448. dw  0575DH, 0F762H, 067CBH, 08065H, 03671H, 0196CH, 006E7H, 06E6BH
  449. dw  01B76H, 0FED4H, 02BE0H, 089D3H, 07A5AH, 010DAH, 04ACCH, 067DDH
  450. dw  0DF6FH, 0F9B9H, 0EFF9H, 08EBEH, 0BE43H, 017B7H, 08ED5H, 060B0H
  451. dw  0A3E8H, 0D6D6H, 0937EH, 0A1D1H, 0C2C4H, 038D8H, 0F252H, 04FDFH
  452. dw  067F1H, 0D1BBH, 05767H, 0A6BCH, 006DDH, 03FB5H, 0364BH, 048B2H
  453. dw  02BDAH, 0D80DH, 01B4CH, 0AF0AH, 04AF6H, 03603H, 07A60H, 04104H
  454. dw  0EFC3H, 0DF60H, 0DF55H, 0A867H, 08EEFH, 0316EH, 0BE79H, 04669H
  455. dw  0B38CH, 0CB61H, 0831AH, 0BC66H, 0D2A0H, 0256FH, 0E236H, 05268H
  456. dw  07795H, 0CC0CH, 04703H, 0BB0BH, 016B9H, 02202H, 0262FH, 05505H
  457. dw  03BBEH, 0C5BAH, 00B28H, 0B2BDH, 05A92H, 02BB4H, 06A04H, 05CB3H
  458. dw  0FFA7H, 0C2D7H, 0CF31H, 0B5D0H, 09E8BH, 02CD9H, 0AE1DH, 05BDEH
  459. dw  0C2B0H, 09B64H, 0F226H, 0EC63H, 0A39CH, 0756AH, 0930AH, 0026DH
  460. dw  006A9H, 09C09H, 0363FH, 0EB0EH, 06785H, 07207H, 05713H, 00500H
  461. dw  04A82H, 095BFH, 07A14H, 0E2B8H, 02BAEH, 07BB1H, 01B38H, 00CB6H
  462. dw  08E9BH, 092D2H, 0BE0DH, 0E5D5H, 0EFB7H, 07CDCH, 0DF21H, 00BDBH
  463. dw  0D2D4H, 086D3H, 0E242H, 0F1D4H, 0B3F8H, 068DDH, 0836EH, 01FDAH
  464. dw  016CDH, 081BEH, 0265BH, 0F6B9H, 077E1H, 06FB0H, 04777H, 018B7H
  465. dw  05AE6H, 08808H, 06A70H, 0FF0FH, 03BCAH, 06606H, 00B5CH, 01101H
  466. dw  09EFFH, 08F65H, 0AE69H, 0F862H, 0FFD3H, 0616BH, 0CF45H, 0166CH
  467. dw  0E278H, 0A00AH, 0D2EEH, 0D70DH, 08354H, 04E04H, 0B3C2H, 03903H
  468. dw  02661H, 0A767H, 016F7H, 0D060H, 0474DH, 04969H, 077DBH, 03E6EH
  469. dw  06A4AH, 0AED1H, 05ADCH, 0D9D6H, 00B66H, 040DFH, 03BF0H, 037D8H
  470. dw  0AE53H, 0A9BCH, 09EC5H, 0DEBBH, 0CF7FH, 047B2H, 0FFE9H, 030B5H
  471. dw  0F21CH, 0BDBDH, 0C28AH, 0CABAH, 09330H, 053B3H, 0A3A6H, 024B4H
  472. dw  03605H, 0BAD0H, 00693H, 0CDD7H, 05729H, 054DEH, 067BFH, 023D9H
  473. dw  07A2EH, 0B366H, 04AB8H, 0C461H, 01B02H, 05D68H, 02B94H, 02A6FH
  474. dw  0BE37H, 0B40BH, 08EA1H, 0C30CH, 0DF1BH, 05A05H, 0EF8DH, 02D02H
  475.  
  476. select _TEXT
  477.  
  478. (*%F RegParam *)
  479. (*%T LongAddr *)
  480. Sseg = 8+frame; Sofs = 6 + frame; Slen = 4+frame; CRC = frame; RetSize = 10
  481. (*%E *)
  482. (*%F LongAddr *)
  483. Sofs = 6+frame; Slen = 4+ frame; CRC = frame; RetSize = 8
  484. (*%E *)
  485. (*%E *)
  486. (*%T RegParam *)
  487. (*%T LongAddr *)
  488.   CRC = frame; RetSize = 4
  489. (*%E *)
  490. (*%F LongAddr *)
  491.   RetSize = 0
  492. (*%E *)
  493. (*%E *)
  494. public CRC$DoC32:
  495. (*%F RegParam *)
  496.   push bp
  497.   mov  bp,sp
  498. (*%E *)
  499. (*%T RegParam *)(*%T LongAddr *)
  500.   push bp
  501.   mov  bp,sp
  502. (*%E *)(*%E *)
  503. (*%T LongAddr *)
  504.   push ds
  505. (*%E *)
  506.   push si
  507.   push di
  508. (*%F RegParam *)
  509.   mov cx,[bp][Slen]
  510.   les  ax,[bp][CRC]
  511.   mov  dx,es             (* CX = L *)
  512.     (*%T LongAddr *)
  513.   lds  si, [bp][Sofs]
  514.     (*%E *)
  515.     (*%F LongAddr *)
  516.   mov  si, ds
  517.   mov  es, si
  518.   mov  si, [bp][Sofs]
  519.     (*%E *)
  520. (*%E *)
  521. (*%T RegParam *)
  522.     (*%T LongAddr *)
  523.   mov  si, ax           (* offset *)
  524.   mov  ds, bx           (* segment *)
  525.   les  ax,[bp][CRC]
  526.   mov  dx,es             (* CX = L *)
  527.     (*%E *)
  528.     (*%F LongAddr *)
  529.   mov  si, ax           (* offset *)
  530.   mov  ax, cx           (* CRC *)
  531.   mov  cx, bx           (* Len *)      (* DX keeps high CRC *)
  532.     (*%E *)
  533. (*%E *)
  534. (*%T LongAddr *)
  535.   mov  di, seg CRC32table    (* just use di to save segment *)
  536. (*%E *)
  537. (*%F LongAddr *)
  538.   mov  di, CRC32table (* use as pointer *)
  539. (*%E *)
  540.   jcxz   CRC32Return
  541. CRC32loop:
  542.   xor    bh,bh
  543.   mov    bl,al
  544.   lodsb
  545.   xor    bl,al
  546.   mov    al,ah
  547.   mov    ah,dl
  548.   mov    dl,dh
  549.   xor    dh,dh
  550.   shl    bx,1
  551.   shl    bx,1
  552. (*%F LongAddr *)
  553.   les    bx,[di][bx]
  554. (*%E *)
  555. (*%T LongAddr *)
  556.   mov    es, di         (* restore es *)
  557.   les    bx, es:[CRC32table][bx]
  558. (*%E *)
  559.   xor    ax,bx
  560.   mov    bx,es
  561.   xor    dx,bx
  562.   loop   CRC32loop
  563. CRC32Return:
  564.   pop  di
  565.   pop  si
  566. (*%T LongAddr *)
  567.   pop  ds
  568. (*%T RegParam *)
  569.   pop  bp
  570. (*%E *)
  571. (*%E *)
  572. (*%F RegParam *)
  573.   pop bp
  574. (*%E *)
  575. (*%F sameCS *)
  576.   ret far RetSize
  577. (*%E *)
  578. (*%T sameCS *)
  579.   ret RetSize
  580. (*%E *)
  581.  
  582. end
  583.  
  584.